package org.dromara.exam.domain.dto;

import cn.hutool.core.date.DateTime;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.LinkedHashMap;
import java.util.List;

/**
 * @author :xiyin321
 * @since : 2024/5/18 16:11
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ProjectSetting {
    /**
     * 1开启 0停止
     */
    private String status;

    private TemplateSchema.QuestionType mode;

    @Builder.Default
    AnswerSetting answerSetting = new AnswerSetting();

    @Builder.Default
    SubmittedSetting submittedSetting = new SubmittedSetting();

    @Builder.Default
    ExamSetting examSetting = new ExamSetting();
    @Data
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class AnswerSetting {

        /**
         * 需要密码填写
         */
        private String password;

        /**
         * 显示填写进度条
         */
        private Boolean progressBar;

        /**
         * 是否需要登录才能作答。 需要登录答卷的几种场景：1、问卷设置直接设置 2、工作流起始节点指定发起人 3、问卷里面有成员和部门题
         */
        private Boolean loginRequired;

        /**
         * 是否显示题号
         */
        private Boolean questionNumber = true;

        /**
         * 自动保存结果
         */
        private Boolean autoSave;

        private LinkedHashMap initialValues;

        /**
         * 回收答案条数限制,
         */
        private Long maxAnswers;

        /**
         * 截止回收时间
         */
        private Long endTime;

        /**
         * 只能通过微信作答
         */
        private Boolean wechatOnly;

        /**
         * ip 答题限制
         */
//        private UniqueLimitSetting ipLimit;

        /**
         * cookie 答题限制
         */
//        private UniqueLimitSetting cookieLimit;



        /**
         * 一页一题
         */
        private Boolean onePageOneQuestion;

        /**
         * 是否显示答题卡
         */
        private Boolean answerSheetVisible;

        /**
         * 白名单类型，支持系统用户和外部导入用户
         *
//         * @see ProjectPartnerTypeEnum
         */
        private Integer whitelistType;

        /**
         * 白名单答题限制
         */
//        private UniqueLimitSetting whitelistLimit;

        /**
         * 问卷校验触发类型
         */
//        private TriggerType triggerType = TriggerType.onBlur;

        /**
         * 是否允许复制题目
         */
        private Boolean copyEnabled = true;

    }

    @Data
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class SubmittedSetting {



        /**
         * 答题完成后跳转自定义页面
         */
        private String contentHtml;

        /**
         * 允许更新答案
         */
        private Boolean enableUpdate;

        /**
         * 答题完成后跳转自定义链接
         */
        private String redirectUrl;

        /**
         * 公开查询
         */
//        private List<PublicQuery> publicQuery;

        /**
         * 查询正确答案和解析
         */
        private Boolean answerAnalysis;

        /**
         * 是否显示成绩单
         */
        private Boolean transcriptVisible;

        /**
         * 显示排行榜
         */
        private Boolean rankVisible;

    }
    @Data
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class ExamSetting {

        /**
         * 考试开始时间
         */
        private DateTime startTime;

        /**
         * 考试结束时间
         */
        private DateTime endTime;

        /**
         * 最短交卷时间(分钟)
         */
        private Integer minSubmitMinutes;

        /**
         * 最长交卷时间(分钟)
         */
        private Integer maxSubmitMinutes;

        /**
         * 显示排名
         */
        private Boolean rankingEnabled;

        /**
         * 练习模式 打完问题后立即显示答案
         */
        private Boolean exerciseMode;

        /**
         * 闯关模式，打完本题才能答下一题
         */
        private Boolean passMode;

        /**
         * 闯关模式每一题的答题限制时间
         */
        private Integer passModePerSeconds;

        /**
         * 随机问题顺序
         */
        private Boolean randomOrder;

        /**
         * 随机问题
         */
        private List<RandomQuestionCondition> randomProject;

        /**
         * 错题练习
         */
        private Boolean randomSurveyWrong;

        /**
         * 登录之后答题限制
         */
        private Long loginLimit;

        /**
         * 考试过程允许切换屏幕次数
         */
        private Integer maxSwitchScreenTimes;

    }
    /**
     * 随机问题条件
     */
    @Data
    public static class RandomQuestionCondition {

        private String id;

        /**
         * 题库ID
         */
        private Long repoId;

        /**
         * 题库选择题数
         */
        private Integer num;

        /**
         * 每题分数
         */
        private Double score;

        /**
         * 标签
         */
        private List<String> tags;

        /**
         * 题型
         */
        private List<String> questionTypes;

    }
}
